# 面向对象
from runpy import run_path


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print("Hello, my name is {} and I am {} years old.".format(self.name, self.age))


p1 = Person("Alice", 25)
p1.say_hello()
print("=" * 80)


class Cat():
    def eat(self):
        print("小猫吃鱼", id(self))

    def drink(self):
        print("小猫喝水")


c1 = Cat()
c1.eat()
c1.drink()


class Dog():
    def eat(self):
        print("小狗吃骨头", id(self))

    def drink(self):
        print("小狗喝水")


d1 = Dog()
d1.eat()
d1.drink()
print("=" * 80)

d2 = Dog()
d2.eat()
d2.drink()
print("=" * 80)


# 获取对象属性
# 对象.属性名
# 添加或修改对象属性
# 对象.属性名 = 数据值
class Cat():
    def eat(self):
        print(f"小猫{self.name}爱吃鱼....")


tom = Cat()
tom.name = "汤姆猫"
tom.eat()
blueCat = Cat()
blueCat.name = "蓝猫"
blueCat.eat()
print("=" * 80)


# 魔法方法
# 魔法方法是Python中一种特殊的函数，它有特殊的用途，可以控制对象的创建、属性的访问、实例的创建、实例的销毁等。
# 魔法方法的名称以__开头和结尾，并且以双下划线__开头的魔法方法是非公开的，不能被直接调用，只能被子类重写。
# 常见的魔法方法有：
# __init__：构造函数，在对象创建时调用，用于初始化对象。
# __str__：打印对象时调用，返回对象的字符串表示。
# __del__：析构函数，在对象销毁时调用，用于释放对象占用的资源。
# __len__：获取对象长度时调用，返回对象包含的元素个数。
# __getitem__：获取对象元素时调用，返回指定索引的元素。
# __setitem__：设置对象元素时调用，设置指定索引的元素。
# __getattr__：获取对象属性时调用，返回指定属性的值。
# __setattr__：设置对象属性时调用，设置指定属性的值。
# __call__：对象作为函数调用时调用，允许对象像函数一样被调用。

# __init__：构造函数，在对象创建时调用，用于初始化对象。
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")


p1 = Person("Alice", 25)
p1.say_hello()
print("=" * 80)


class Cat:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"小猫{self.name}爱吃鱼....")


jack = Cat("杰克")
jack.eat()
print("=" * 80)
blueCat = Cat("蓝猫")
blueCat.eat()
print("=" * 80)


class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"{self.age}的{self.name}汪汪汪的叫....")

    def __str__(self):
        return f"{self.name}是一只{self.age}岁的小狗"  # __str__：打印对象时调用，返回对象的字符串表示。


dog1 = Dog("jack", 2)
dog1.bark()
print(dog1)
print("=" * 80)


class Person:
    def __init__(self, name, weight, sport):
        self.name = name
        self.weight = weight
        self.sport = sport

    def __str__(self):
        return f"{self.name}的体重是{self.weight}kg，喜欢{self.sport}。"  # __str__：打印对象时调用，返回对象的字符串表示。

    def run(self):
        print(f"{self.name}正在跑步...")
        self.weight -= 5

    def eat(self):
        print(f"{self.name}偷吃，体重增加了0.5kg。")


p1 = Person("Alice", 60, "篮球")
print(Person.run(p1))
print(Person.eat(p1))
print(p1)
print("=" * 80)

xmei = Person("小美", 50, "跑步")
print(xmei)
xmei.run()
print(xmei)
print("=" * 80)


class loginPage:
    def __init__(self, username, password, code):
        self.username = username
        self.password = password
        self.code = code

    def login(self):
        print(f"请输入用户名：{self.username}")
        print(f"请输入密码：{self.password}")
        print(f"请输入验证码：{self.code}")
        print("登录成功！")


aa = Person("aa", 12, "basketball")
print(aa)
print("=" * 80)


class HouseItem:
    def __init__(self, name, size):
        self.name = name  # 家具名称
        self.size = size  # 家具占地面积

    def __str__(self):
        return f"{self.name}的大小是{self.size}平方米。"


class House:
    def __init__(self, h_type, area):
        self.h_type = h_type
        self.total_area = area
        self.free_area = area
        self.item_list = []  # 移除了重复定义

    def __str__(self):
        # 优化输出格式，显示家具列表
        items = ", ".join([item.name for item in self.item_list])
        return f"{self.h_type}的面积是{self.total_area}平方米，剩余{self.free_area}平方米。\n家具列表：{items}"

    def add_item(self, item):
        if self.free_area >= item.size:
            print(f"添加{item.name}...")
            self.item_list.append(item)
            self.free_area -= item.size  # 更新剩余面积
            print(f"添加{item.name}成功！")
        else:
            print(f"剩余空间不足，无法添加{item.name}！")


# 测试代码
house = House("三室两厅", 100)
house.add_item(HouseItem("床", 20))
house.add_item(HouseItem("衣柜", 10))
house.add_item(HouseItem("电视", 50))
print(house)
print("=" * 80)


# 作业
class Fruit:
    def __init__(self, name, color, price):
        self.name = name
        self.color = color
        self.price = price

    def __str__(self):
        return f"{self.name}的颜色是{self.color}，价格是{self.price}元。"

    def show(self):
        print(f"水果名称：{self.name}，颜色：{self.color}，价格：{self.price}元。")


fruit = Fruit("苹果", "红色", 2.5)
print(fruit)
fruit.show()
print("=" * 80)


# class Computer:
#     def __init__(self, brand, price,play_movie):
#         self.brand = brand
#         self.price = price
#         self.play_movie = play_movie
#     def __str__(self):
#         return f"{self.brand}电脑播放{self.play_movie}。"
# computer=Computer("戴尔","10000","《盗梦空间》")
# print(computer)
# print("="*80)

class Computer:
    def __init__(self, brand, price):
        self.brand = brand
        self.price = price

    def play_movie(self, movie):
        print(f"{self.brand}电脑播放{movie}。")
    # def __str__(self):
    #     return f"{self.brand}电脑价格是{self.price}元。"


computer = Computer("戴尔", "10000")
computer.play_movie("《盗梦空间》")
# print(computer)
print("=" * 80)
